home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr47 / wasm223.zip / VIDEO1.ASM < prev    next >
Assembly Source File  |  1993-05-04  |  9KB  |  265 lines

  1. ;********************************************;
  2. ; WASM Video Module, Initialization Routines ;
  3. ; By Eric Tauck                              ;
  4. ;                                            ;
  5. ; Defines:                                   ;
  6. ;                                            ;
  7. ;   ModDim   return the screen dimensions    ;
  8. ;   ModGet   return the current mode         ;
  9. ;   VidInit  initialize the video routines   ;
  10. ;********************************************;
  11.  
  12.         jmp     _video1_end
  13.  
  14. ;========================================
  15. ; Symbolic modes.
  16.  
  17. TEXT4012        EQU     1       ;40 columns, 12 rows
  18. TEXT4014        EQU     2       ;40 columns, 14 rows
  19. TEXT4021        EQU     3       ;40 columns, 21 rows
  20. TEXT4025        EQU     4       ;40 columns, 25 rows
  21. TEXT4028        EQU     5       ;40 columns, 28 rows
  22. TEXT4043        EQU     6       ;40 columns, 43 rows
  23. TEXT4050        EQU     7       ;40 columns, 50 rows
  24. TEXT8012        EQU     8       ;80 columns, 12 rows
  25. TEXT8014        EQU     9       ;80 columns, 14 rows
  26. TEXT8021        EQU     10      ;80 columns, 21 rows
  27. TEXT8025        EQU     11      ;80 columns, 25 rows
  28. TEXT8028        EQU     12      ;80 columns, 28 rows
  29. TEXT8043        EQU     13      ;80 columns, 43 rows
  30. TEXT8050        EQU     14      ;80 columns, 50 rows
  31.  
  32. ;========================================
  33. ; Global video data.
  34.  
  35. _vid_CVIS        EQU     01H            ;curor is visible flag
  36. _vid_CACT        EQU     02H            ;curor is active flag
  37. _vid_flags       DB      0              ;current video flags
  38.  
  39. _vid_colrows     LABEL   WORD
  40. _vid_cols        DB      ?              ;current column
  41. _vid_rows        DB      ?              ;current row
  42.  
  43. _vid_page        DB      ?              ;video page
  44.  
  45. _vid_con         DW      ?              ;cursor-on scan pattern
  46. _vid_coff        DW      ?              ;cursor-off scan pattern
  47. _vid_curadv      DB      ?              ;cursor advance
  48.  
  49. _vid_attr        DB      ?              ;current attribute
  50.  
  51. _vid_colrow      LABEL   WORD
  52. _vid_col         DB      ?              ;current column
  53. _vid_row         DB      ?              ;current row
  54.  
  55. _vid_base        DW      ?              ;base offset
  56. _vid_addr        LABEL   DWORD          ;current address
  57. _vid_addroff     DW      ?              ;  offset
  58. _vid_addrseg     DW      ?              ;  segment
  59.  
  60. ;========================================
  61. ; Determine the current screen mode
  62. ; dimensions.
  63. ;
  64. ; Out: AH= rows; AL= columns.
  65.  
  66. ModDim  PROC   NEAR
  67.         mov     ah, 15          ;get video information function
  68.         int     10H             ;execute
  69.         push    ax              ;save columns
  70.         mov     al, 25          ;default rows
  71.         push    ax              ;save that
  72.  
  73. ;--- get EGA/VGA row information
  74.  
  75.         mov     ah, 12H         ;EGA alternate function
  76.         mov     bl, 10H         ;information subfunction
  77.         int     10H             ;execute
  78.         cmp     bl, 10H         ;check if EGA or VGA present
  79.         je      _mddim1         ;jump if not
  80.         push    bp
  81.         push    es
  82.         mov     ax, 1130H       ;get font info function
  83.         sub     bh, bh          ;font pointer (just in case)
  84.         int     10H             ;execute
  85.         pop     es
  86.         pop     bp
  87.         pop     ax              ;drop old value
  88.         inc     dl              ;increment rows
  89.         push    dx
  90.  
  91. ;--- finished
  92.  
  93. _mddim1 pop     dx              ;restore rows
  94.         mov     ah, dl          ;return in AH
  95.         pop     dx              ;restore columns
  96.         mov     al, dh          ;return in AL
  97.         ret
  98.         ENDP
  99.  
  100. ;========================================
  101. ; Get the current mode.
  102. ;
  103. ; Out: AL= mode; CY= set if error.
  104.  
  105. ModGet  PROC    NEAR
  106.         push    di
  107.  
  108. ;--- make sure in valid mode (i.e. not graphics)
  109.  
  110.         mov     ah, 15                  ;get video information function
  111.         int     10H                     ;execute
  112.  
  113.         mov     cx, 5                   ;number of valid modes
  114.         mov     di, OFFSET _vid_validtex ;address of table
  115.         cld
  116.         repne                           ;repeat until found
  117.         scasb                           ;scan
  118.         jne     _mdget1                 ;jump if error
  119.  
  120. ;--- determine text mode
  121.  
  122.         call    ModDim                  ;get current dimesions
  123.         mov     cx, 14                  ;load number of modes
  124.         mov     di, OFFSET _vid_texmodes ;address of table
  125.         cld
  126.         repne                           ;repeat until found
  127.         scasw                           ;scan
  128.         jne     _mdget1                 ;jump if error
  129.         mov     ax, cx                  ;return mode
  130.         inc     ax                      ;adjust mode
  131.         pop     di
  132.         clc
  133.         ret
  134.  
  135. ;--- error
  136.  
  137. _mdget1 sub     ax, ax                  ;return 0
  138.         pop     di
  139.         stc
  140.         ret
  141.  
  142. ;--- data
  143. _vid_validtex   DB      0, 1, 2, 3, 7
  144. _vid_texmodes   DW      (50*256)+80, (43*256)+80, (28*256)+80
  145.                 DW      (25*256)+80, (21*256)+80, (14*256)+80
  146.                 DW      (12*256)+80, (50*256)+40, (43*256)+40
  147.                 DW      (28*256)+40, (25*256)+40, (21*256)+40
  148.                 DW      (14*256)+40, (12*256)+40
  149.         ENDP
  150.  
  151. ;========================================
  152. ; Set current video address.
  153. ;
  154. ; In: AH= row; AL= column.
  155.  
  156. _vid_setaddr PROC NEAR
  157.         mov     dl, al          ;save column
  158.         mov     al, ah          ;put row in AL
  159.         mul     al, _vid_cols   ;row times columns
  160.         sub     dh, dh          ;DX has columns
  161.         add     ax, dx          ;add columns
  162.         shl     ax              ;offset from start of buffer
  163.         add     ax, _vid_base   ;add base address
  164.         mov     _vid_addroff, ax ;save offset
  165.         ret
  166.         ENDP
  167.  
  168. ;========================================
  169. ; Initialize video data.
  170. ;
  171. ; Out: CY= set if error.
  172.  
  173. VidInit PROC   NEAR
  174.         call    ModDim          ;get screen dimensions
  175.         mov     _vid_colrows, ax ;save columns and rows
  176.  
  177.         mov     ah, 0FH         ;get video info function
  178.         int     10H             ;execute
  179.         mov     _vid_page, bh   ;save page
  180.  
  181.         mov     cx, 5                   ;number of valid hardware modes
  182.         mov     bx, OFFSET _vid_addrs   ;address of mode data
  183.  
  184. _vdini1 cmp     [bx], al        ;check if mode matches
  185.         je      _vdini3         ;exit loop if so
  186.         add     bx, 4           ;next entry
  187.         loop    _vdini1         ;loop back if more
  188.  
  189. ;--- error
  190.  
  191. _vdini2 stc
  192.         ret
  193.  
  194. ;--- base screen address
  195.  
  196. _vdini3 push    WORD [bx+2]
  197.         pop     _vid_addrseg            ;set video segment
  198.  
  199.         call    ModGet                  ;get current mode
  200.         jc      _vdini2
  201.         mov     bl, al
  202.         dec     bl
  203.         sub     bh, bh
  204.         shl     bx                      ;times two, page size table offset
  205.  
  206.         mov     al, _vid_page           ;current page
  207.         sub     ah, ah
  208.         mul     ax, [_vid_psize+bx]     ;offset to current page
  209.         mov     _vid_base, ax           ;save base offset
  210.  
  211. ;--- starting cursor location
  212.  
  213.         mov     ah, 3                   ;cursor location function
  214.         mov     bh, _vid_page           ;current page
  215.         int     10H                     ;execute
  216.         mov     _vid_con, cx            ;save cursor-on scan pattern
  217.         mov     _vid_coff, 2000H        ;cursor-off scan pattern
  218.         or      _vid_flags, _vid_CVIS or _vid_CACT  ;set cursor flags
  219.         mov     ax, dx
  220.         mov     _vid_colrow, ax         ;save column and row
  221.         call    _vid_setaddr            ;set cursor address
  222.  
  223. ;--- current attribute
  224.  
  225.         mov     ah, 8           ;read character/attribute function
  226.         mov     bh, _vid_page   ;current page
  227.         int     10H             ;execute
  228.         mov     _vid_attr, ah   ;save
  229.  
  230. ;--- done
  231.  
  232.         clc
  233.         ret
  234.  
  235. ;--- base addresses of the hardware modes
  236.  
  237. _vid_addrs LABEL WORD
  238.         DW      00H, 0B800H
  239.         DW      01H, 0B800H
  240.         DW      02H, 0B800H
  241.         DW      03H, 0B800H
  242.         DW      07H, 0B000H
  243.  
  244. ;--- page sizes of the video modes
  245.  
  246. _vid_psize LABEL WORD
  247.         DW      40 * 12 * 2 + 256       ;M4012
  248.         DW      40 * 14 * 2 + 256       ;M4014
  249.         DW      40 * 21 * 2 + 256       ;M4021
  250.         DW      800H                    ;M4025, on most adapters
  251.         DW      40 * 28 * 2 + 256       ;M4028
  252.         DW      40 * 43 * 2 + 256       ;M4043
  253.         DW      40 * 50 * 2 + 256       ;M4050
  254.         DW      80 * 12 * 2 + 256       ;M8012
  255.         DW      80 * 14 * 2 + 256       ;M8014
  256.         DW      80 * 21 * 2 + 256       ;M8021
  257.         DW      1000H                   ;M8025, on most adapters
  258.         DW      80 * 28 * 2 + 256       ;M8028
  259.         DW      80 * 43 * 2 + 256       ;M8043
  260.         DW      80 * 50 * 2 + 256       ;M8050
  261.  
  262.         ENDP
  263.  
  264. _video1_end
  265.